package main

import "fmt"

func main() {

	//1、golang定义字符  单引号是定义字符
	var a = 'a'                      //定义字符 只能有一个元素
	fmt.Printf("值：%v,类型：%T\n", a, a) //值：97,类型：int32

	//2、输出原样字符
	fmt.Printf("值：%c,类型：%T\n", a, a) //值：a,类型：int32

	//3、输出字符串中的字符
	var str = "this"
	fmt.Printf("值：%c,类型：%T\n", str[2], str[2]) //值：i,类型：uint8

	//4、一个汉字占用3个字节（golang中使用 utf-8编码）,一个字母占用一个字节
	//unsafe.Sizeof() 无法查看字符串类型占用存储空间 使用len()可以
	fmt.Println(len(str)) //4
	str2 := "你好golang"
	fmt.Println(len(str2)) //12

	var s = '国'                      // unicode编码 国 对应 22269
	fmt.Printf("值：%v,类型：%T\n", s, s) //值：22269,类型：int32

	//5、遍历输出字符串  for   range
	for i := 0; i < len(str); i++ { //byte 类型   代表ASCII码的一个字符
		fmt.Printf("%v(%c)", str2[i], str2[i]) //28(ä)189(½)160( )229(å) 有中文 导致乱了
	}

	for _, r := range str2 { //rune类型   代表utf-8的一个字符
		fmt.Printf("%v(%c)\n", r, r) //20320(你)22909(好)103(g)111(o)108(l)97(a)110(n)103(g)
	}

	//5、修改字符串
	s1 := "big"
	// s1[0] = "s"  //直接修改报错
	byteStr := []byte(s1) //如果存在汉字不能私用byte
	byteStr[0] = 'p'
	fmt.Println(string(byteStr)) //pig

	s2 := "你好"
	runeStr := []rune(s2)
	runeStr[0] = '我'
	fmt.Println(string(runeStr)) //我好
}
